/********************************************************************************
* writer: S DJ
* create date: 2017-8-1
* description:基础服务类，封装了AliyunOSS操作的常用方法。如上传、下载、删除等
* rewriter:
* rewrite date:
* description:

*********************************************************************************/

/*******喜悦家 OSS上已建Bucket文件夹说明**************
 * 图片头像Bucket:    xyj-img-avatar
 * 图片认证Bucket:    xyj-img-certificate
 * 图片房子Bucket:    xyj-img-house
 *******************************************/
function ALIYUNOSS() {
    var _aliyunOSS = api.require('aliyunOSS');
    var _status = false;      // aliyunOSS 初始化状态
    var _endpoint = 'oss-cn-beijing.aliyuncs.com';  //请求的bucket域名地址(华北2)

    //通过bucket和objectKey获取文件完整的OSS路径
    function _getOSSPath(pBucketName,pObjectKey) {
        return 'http://'+pBucketName+'.'+_endpoint+'/'+pObjectKey;
    }
    //解析文件完整的OSS路径获得bucket和objectKey
    function _analysisOSSURL(pOSSUrl, pAttribute) {
        if('string' != typeof pOSSUrl || pOSSUrl.length==0) {
            console.log('pOSSUrl=='+pOSSUrl);
            return;
        }
        var tReg = /\.[\w|\-]*\.aliyuncs.com\//gi;  //匹配阿里云OSS的endpoit
        var tEndPoint = tReg.exec(pOSSUrl);
        var tArr = pOSSUrl.split(tEndPoint);
        tBucketName = tArr[0].split('//')[1];
        tObjectKey = tArr[1];
        // console.log('_analysisOSSURL 解析结果[]=='+JSON.stringify(tArr));
        if('bucket'== pAttribute) {
            return tBucketName;
        }
        else if ('object' == pAttribute) {
            return tObjectKey;
        }
        else {
            return { bucketName: tBucketName, objectKey: tObjectKey };
        }
    }
    // 初始化aliyunOSS
    function _initOSS(pCallback) {
        _aliyunOSS.initOSSClient({
            endpoint : 'https://'+_endpoint,
            accessKeyId : _ossId,
            accessKeySecret:_ossKey,
        },function(ret,err){
            // console.log('OSS init result:  ret=='+JSON.stringify(ret)+'____err=='+JSON.stringify(err));
            if(ret && ret.status) {
                //初始化成功
                _status = ret.status;
            }
            if('function' === typeof pCallback) {
                pCallback(ret,err);
            }
        });
        // _aliyunOSS.initOSSClient({
        //     endpoint : "http://oss-cn-shanghai.aliyuncs.com",
        //     serverUrl : "https://localhost:8080/distribute-token.json",
        // },function(ret,err){
        //     if(ret){
        //         alert(JSON.stringify(ret));
        //     }
        //     else{
        //         alert(JSON.stringify(err));
        //     }
        // });
    }
    // 上传文件到OSS
    function _upload(pFile, pBucketName, pObjectKey, pCallback) {
        _aliyunOSS.upload({
            file : pFile,
            bucketName : pBucketName,
            objectKey : pObjectKey,
            uploadType :1,    //上传文件的类型，1为异步上传，2为追加上传，3为断点续传(Android仅支持异步上传)
        }, function(ret, err) {
            // console.log('OSS upload结果  ret=='+JSON.stringify(ret)+'____err=='+JSON.stringify(err));
            if(ret && 'complete' == ret.oper) {
                ret.filepath = _getOSSPath(pBucketName,pObjectKey);
            }
            if('function' === typeof pCallback) {
                pCallback(ret,err);
            }
        });
    }
    //内部下载对象方法
    function _download(pBucketName, pObjectKey, pProcess, pCallback) {
        _aliyunOSS.download({
            bucketName: pBucketName,
            objectKey : pObjectKey,
            process: pProcess
        }, function(ret, err) {
            if('function' === typeof pCallback) {
                pCallback(ret,err);
            }
        });
    }
    //内部删除对象方法
    function _deleteObject( pBucketName, pObjectKey, pCallback ) {
        _aliyunOSS.deleteObject({
            bucketName: pBucketName,
            objectKey : pObjectKey,
        }, function(ret, err) {
            console.log('OSS执行删除 bucketName='+pBucketName+'____object='+ pObjectKey +'____结果=='+JSON.stringify(ret));
            if('function' == typeof pCallback) {
                pCallback(ret,err);
            }
        });
    }

    var _oss = {};
    // 返回模块的初始化状态
    _oss.InitStatus = function() {
        return _status;
    }
    _oss.Endpoint = function() {
        return _endpoint;
    }
    _oss.getFullPath = function(pBucketName,pFileName) {
        return _getOSSPath();
    }
    /**
     * 解析完整的OSSURL路径，获取Butket和ObjectKey
     * @param  {String} pOSSUrl    必填,完整OSS路径  如，https://xyj-img-avatar.oss-cn-beijing.aliyuncs.com/avatar12345678.png
     * @param  {String} pAttribute 选填，‘bucket’返回butketName， ‘object’返回ObjectKey, 缺省则返回JSON对象， 格式：{ bucketName: tBucketName, objectKey: tObjectKey };
     * @return {String/Object}     返回值格式根据参数pAttribute确定
     */
    _oss.analysisOSSURL = function(pOSSUrl, pAttribute) {
        _analysisOSSURL(pOSSUrl, pAttribute);
    }
    var _ossId = api.loadSecureValue({ key: 'ossId', sync: true });
    var _ossKey = api.loadSecureValue({ key: 'ossKey', sync: true });

    //初始化
    _oss.Init = function(pCallback) {
        _initOSS(pCallback);
    }

    /**
     * 上传文件
     * @param  {String} pFile       必填，要上传的文件，支持fs://、cache://等文件路径协议及真实路径。
     * @param  {String} pBucketName 必填，Bucket名称
     * @param  {String} pObjectKey  必填，待删除的阿里OSS文件名（可包含路径），如"folder/subfolder/file",路径默认是”根目录”，不需要以’/‘开头。
     * @param  {Function} pCallback  回调函数 pCallback(ret,err){}

          ret = {
                   oper: 'complete',        // 上传完成，字符串类型
                   requestId:'requestId',   // x-oss-request-id是由Aliyun OSS创建，并唯一标识这个response的UUID。如果在使用OSS服务时遇到问题，可以凭借该字段联系OSS工作人员，快速定位问题。字符串类型
                   etag:'etag'              // ETag (entity tag) 在每个Object生成的时候被创建，用于标示一个Object的内容。
                                               对于Put Object请求创建的Object，ETag值是其内容的MD5值；对于其他方式创建的Object，ETag值是其内容的UUID。
                                               ETag值可以用于检查Object内容是否发生变化。字符串类型
               }
          err = {
                     code: 404,       //数字类型；错误码
                     msg:"错误信息描述" //字符串类型；
                 }
     *
     */
    _oss.Upload = function(pFile,pBucketName,pObjectKey,pCallback) {
        // console.log('OSS upload  pFilepath=='+pFile+'____pObjectKey=='+pObjectKey);
        if(_status) {
            _upload(pFile,pBucketName,pObjectKey,pCallback);
        }
        else {
            _initOSS(function(ret,err){
                if(ret && ret.status) {
                    _upload(pFile,pBucketName,pObjectKey,pCallback);
                }
                else {
                    if('function' == typeof pCallback) {
                        pCallback(ret,err);
                    }
                }
            })
        }
    }

    /**
     * 下载文件
     * @param  {Object/String} pParam 参数对象，可输入JSON格式或字符串格式的参数
		 *				 JSON格式  {bucketName:'xyj-img-avatar', objectKey:'avatar12345678.png'}
		 *				 @subParam  {String} pBucketName 必填，Bucket名称
		 *				 @subParam  {String} pObjectKey  必填，阿里OSS文件名（可包含路径），如"folder/subfolder/file",路径默认是”根目录”，不需要以’/‘开头。
     * @param  {String} pProcess  （可选项）下载图片时对图片进行处理的命令。处理命令参见阿里文档：图片处理 (仅当下载图片时有效)
     * @param  {Function} pCallback  回调函数 pCallback(ret,err){}
     * @return
     */
    _oss.Download = function(pParam, pProcess, pCallback) {
        var tBucketName;
        var tObjectKey;
        //输入参数类型判断解析
        if('[object Object]' == Object.prototype.toString.call(pParam)) {
            tBucketName = pParam.bucketName;
            tObjectKey = pParam.objectKey;
        }
        else if ('string' == typeof pParam) {
            _analysisOSSURL(pParam);
            if(!tObj) {
                return;
            }
            tBucketName = tObj.bucketName;
            tObjectKey = tObj.objectKey;
        }
        else {
            return;
        }
        //初始化检验
        if(_status) {
            _download(tBucketName, tObjectKey, pProcess, pCallback);
        }
        else {
            _initOSS(function(ret,err){
                if(ret && ret.status) {
                    _download(pBucketName, pObjectKey, pProcess, pCallback);
                }
                else {
                    if('function' == typeof pCallback) {
                        pCallback(ret,err);
                    }
                }
            })
        }

    }
    /**
     * 删除文件
     * @param  {Object/String} pParam 参数对象，可输入JSON格式或字符串格式的参数
		 *				 JSON格式  {bucketName:'xyj-img-avatar', objectKey:'avatar12345678.png'}
		 *				 @subParam  {String} pBucketName 必填，Bucket名称
		 *				 @subParam  {String} pObjectKey  必填，阿里OSS文件名（可包含路径），如"folder/subfolder/file",路径默认是”根目录”，不需要以’/‘开头。
     * @param  {Function} pCallback  回调函数 pCallback(ret,err){}
     *                               ret对象 {status:true}   //删除成功
     */
    _oss.DeleteObject = function(pParam, pCallback) {
        var tBucketName;
        var tObjectKey;
        //输入参数类型判断解析
        if('[object Object]' == Object.prototype.toString.call(pParam)) {
            tBucketName = pParam.bucketName;
            tObjectKey = pParam.objectKey;
        }
        else if ('string' == typeof pParam) {
            var tObj = _analysisOSSURL(pParam);
            // console.log('tObj=='+JSON.stringify(tObj));
            if(!tObj) {
                return;
            }
            tBucketName = tObj.bucketName;
            tObjectKey = tObj.objectKey;
        }
        else {
            return;
        }
        //初始化检验
        if(_status) {
            _deleteObject(tBucketName, tObjectKey, pCallback);
        }
        else {
            _initOSS(function(ret,err){
                if(ret && ret.status) {
                    _deleteObject(tBucketName, tObjectKey, pCallback);
                }
                else {
                    if('function' == typeof pCallback) {
                        pCallback(ret,err);
                    }
                }
            })
        }
    }

    return _oss;
}
